iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
0
Software Development

從Java進入AWS部署RESTful API的心路歷程系列 第 7

Day07-概觀(三)Json from Request

  • 分享至 

  • xImage
  •  

前言

續前一篇文章,本篇稍微試了一下處理request的Json,但之後並不會使用本篇的方法,如果對Java處理Json資料很熟悉的朋友可以跳過本篇。

Request 內容的處理

API Gateway for JAVA對於Json request/response的處理是使用Jackson,這在建立好的Project中Maven Dependencies當中就看的出來已經包含在裡面了,但我們先來試著讀取request當中的json看看吧。

當然你也可以使用自己習慣的Json Library,不過之後都以Jackson做為示範。

我希望從request.body當中取得name的value,反正已經先看過完整的request內容,就偷懶一下直接用找到field name去找吧

JsonNode node = new ObjectMapper().valueToTree(input).get("body");
String name = "John Doe";
if (node.has("name"))
    name = node.get("name").asText();

response原本的匿名物件,也偷懶一下改一改

return new Object() {
    public int statusCode = 200;
    public String body;
    public Object withBody(String body) {
        this.body = body;
        return this;
    }
}.withBody("{\"message\":\"Hello " + name + " from Lambda!\"}");

然後發出包含{"name": "Spencer Liu"}的request..
唉..等等,沒有找到怎麼看到的是Jhon Doe,沒有抓到name嗎?
我們把body的內容輸出看看

"{\"name\": \"Spencer Liu\"}"

原來整個body的內容被加上脫逸符號並用雙引號包起來的... 沒錯,首尾的兩個雙引號不是我要表示字串才打上去的,而是字串內容就包含頭尾的雙引號...
所以很麻煩的,只好把body內容做一點處理後重新轉成Jason

以下是調整後完整的handler

@Override
public Object handleRequest(Object input, Context context) {
    context.getLogger().log("Input: " + input + "\n");
    // TODO: implement your handler
    ObjectMapper mapper = new ObjectMApper();
    JsonNode node = mapper.valueToTree(input);
    String body = node.get("body").toString();
    body = body.replace("\\", "").substring(1, body.length() - 1);
    context.getLogger().log(body + "\n");
    try {
        node = mapper.readTree(body);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String name = "John Doe";
    if (node.has("name"))
        name = node.get("name").asText();
    context.getLogger().log("name: " + name + "\n");
    return new Object() {
        public int statusCode = 200;
        public String body;
        public Object withBody(String body) {
            this.body = body;
            return this;
        }
    }.withBody("{\"message\":\"Hello " + name + " from Lambda!\"}");
}

這時候再重新送出request,終於正確得到
https://ithelp.ithome.com.tw/upload/images/20190918/201209111Q1IBn61LC.png

後記

因為是比較隨意的測試,尤其其中對字串處理的方式有不少缺陷,這也是最開始看同事測試時有遇到的狀況。實際上,之後要講的是另一種做法,也是AWS文件上有示範的用POJO來處理request/response的方法,對於再Java上設計跟撰寫都比較容易處理也比較漂亮? ,也會有比較詳細示範的部分。


上一篇
Day06-概觀(二)Run as API Gateway
下一篇
Day08-概觀(四)AWS Lambda Function Handler in Java
系列文
從Java進入AWS部署RESTful API的心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言